package LeetCode刷题;

/**
 * @program: Java_Study
 * @author: Xiaofan
 * @createTime: 2022-01-10 10:16
 * @description: Functions of this class is
 * 官方题解：
 * public int subarraySum(int[] nums, int k) {
 *         // hash
 *         // 记录合适的连续字符串数量
 *         int count=0;
 *         // 记录前面数字相加之和
 *         int pre=0;
 *         // map记录前几个数字之和为K出现相同和的次数为V
 *         HashMap<Integer,Integer> map = new HashMap<>();
 *
 *         // 初始化，
 *         //关于mp.put(0, 1); 这一行的作用就是为了应对 nums[0] +nums[1] + ... + nums[i] == k 的情况的, 也就是从下标 0 累加到下标 i的这个结果
 *         //就假如从0~i的前缀和刚好就是答案，那么当他取map.get(pre-k)的时候即取map.get(0)的时候，是没有值的，所以会出现错误
 *         map.put(0,1);//!!!!!!!!!!!!!千万别忘记这个!!!!!!!!!!!!!!!!!!!!!!
 *
 *
 *         for (int i = 0; i < nums.length; i++) {
 *             pre+= nums[i];
 *             // 前缀和，设 pre[i]=pre[i−1]+nums[i]
 *             // 由于补上了0，1这个情况 问题由多少个连续数字之和等于k 转为
 *             // pre[i]−pre[j−1]==k （前缀和之差为k，代表这两个前缀和中间的数字相加就是K）
 *             // 如果前面某些数字之和加上这个数字正好等于K（存在一个数字加上nums[i]结果为K
 *             // 说明找到了
 *             if (map.containsKey(pre-k)){
 *                 // 累计
 *                 count+=map.get(pre-k);
 *             }
 *             // 计算新的和放入map
 *             map.put(pre,map.getOrDefault(pre,0)+1);
 *         }
 *         return count;
 *     }
 **/
public class NoNoNoNo和为k的子数组 {
    public static void main(String[] args) {

    }
}